package com.taotao.job.rpc.sofabolt;

import com.alipay.remoting.AsyncContext;
import com.alipay.remoting.BizContext;
import com.alipay.remoting.rpc.protocol.AsyncUserProcessor;
import com.alipay.remoting.rpc.protocol.SyncUserProcessor;
import com.taotao.job.rpc.core.invoker.InvokerMeta;
import com.taotao.job.rpc.invoker.caller.RequestData;
import com.taotao.job.rpc.invoker.caller.ResponseData;
import com.taotao.job.rpc.server.invoker.LocalInvoker;
import lombok.extern.slf4j.Slf4j;

/**
 * 处理RequestData,返回ResponseData
 *
 * @author fanbeibei
 * @date 2021/4/4 14:53
 */
@Slf4j
public class RequestDataAsyncUserProcessor extends SyncUserProcessor<RequestData> {

    private LocalInvoker invokerLocal;

    public RequestDataAsyncUserProcessor(LocalInvoker invokerLocal){
        this.invokerLocal = invokerLocal;
    }


    @Override
    public Object handleRequest(BizContext bizCtx, RequestData request) throws Exception {
        if (bizCtx.isRequestTimeout()) {
            //处理时已超时
            log.info("RequestTimeout!!! arrive time: {},request={}", bizCtx.getArriveTimestamp(), request);
            return null;
        }

        InvokerMeta invokerMeta = new InvokerMeta(request.getIfaceMeta(),request.getArgs());
        Object result = invokerLocal.invokeMethod(invokerMeta, null);

        return new ResponseData(ResponseData.CODE_SUCCESS,null,result);
    }

//    @Override
//    public void handleRequest(BizContext bizCtx, AsyncContext asyncCtx, RequestData request) {
//        /**
//         *  与SyncUserProcessor差别是多提供了一个参数AsyncContext,可以异步去sendResponse
//         */
//
//        if (bizCtx.isRequestTimeout()) {
//            //处理时已超时
//            log.info("RequestTimeout!!! arrive time: {},request={}", bizCtx.getArriveTimestamp(), request);
//            return;
//        }
//
//        InvokerMeta invokerMeta = new InvokerMeta(request.getIfaceMeta(),request.getArgs());
//        Object result = invokerLocal.invokeMethod(invokerMeta, null);
//
//        //这里不是异步,要异步处理的话，把代码写到另一个线程中
//        asyncCtx.sendResponse(new ResponseData(ResponseData.CODE_SUCCESS,null,result));
//    }

    @Override
    public String interest() {
        return RequestData.class.getName();
    }
}
